{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## OpenAI形式"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--reason--\n",
      "Okay\n",
      "\n",
      "--response--\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from openai import OpenAI\n",
    "\n",
    "client = OpenAI(\n",
    "    api_key=\"sk-0e687ddcf0164a6fb66c1096447223c4\",  # 阿里百炼大模型API获取：https://bailian.console.aliyun.com/?apiKey=1#/api-key\n",
    "    base_url=\"https://dashscope.aliyuncs.com/compatible-mode/v1\" # 使用文档：https://help.aliyun.com/zh/model-studio/getting-started/what-is-model-studio\n",
    ")\n",
    "\n",
    "def llm(system_prompt, query):\n",
    "\n",
    "    completion = client.chat.completions.create(\n",
    "        model=\"deepseek-r1-distill-qwen-32b\", # deepseek-r1, deepseek-r1-distill-qwen-32b\\\n",
    "        temperature=0,\n",
    "        max_tokens=1,\n",
    "        messages=[{'role': 'system', 'content': system_prompt},\n",
    "                  {'role': 'user', 'content': query}],\n",
    "        )\n",
    "    return completion.choices[0].message.content, completion.choices[0].message.reasoning_content\n",
    "response, reason = llm(\"\", \"Just say hi and nothing else。\")\n",
    "print(\"--reason--\")\n",
    "print(reason)\n",
    "print(\"\\n--response--\")\n",
    "print(response)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## ollama形式"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<think>\n",
      "To find the sum of numbers from 1 to 10, I can use the formula for the sum of an arithmetic series.\n",
      "\n",
      "First, identify the number of terms in the series. Since we're adding from 1 to 10, there are 10 terms.\n",
      "\n",
      "Next, determine the first term and the last term of the series. The first term is 1, and the last term is 10.\n",
      "\n",
      "Using the formula for the sum of an arithmetic series: Sum = (number of terms) × (first term + last term) / 2\n",
      "\n",
      "Plugging in the values: Sum = 10 × (1 + 10) / 2 = 55\n",
      "</think>\n",
      "\n",
      "To find the sum of the numbers from \\(1\\) to \\(10\\), we can use the formula for the sum of an arithmetic series:\n",
      "\n",
      "\\[\n",
      "\\text{Sum} = \\frac{n}{2} \\times (\\text{first term} + \\text{last term})\n",
      "\\]\n",
      "\n",
      "Where:\n",
      "- \\(n\\) is the number of terms.\n",
      "\n",
      "**Step 1:** Determine the number of terms.\n",
      "Since we're adding from \\(1\\) to \\(10\\), there are \\(10\\) terms.\n",
      "\n",
      "**Step 2:** Identify the first and last terms.\n",
      "- First term (\\(a_1\\)) = \\(1\\)\n",
      "- Last term (\\(a_n\\)) = \\(10\\)\n",
      "\n",
      "**Step 3:** Plug the values into the formula.\n",
      "\n",
      "\\[\n",
      "\\text{Sum} = \\frac{10}{2} \\times (1 + 10) = 5 \\times 11 = 55\n",
      "\\]\n",
      "\n",
      "**Final Answer:**\n",
      "\n",
      "\\[\n",
      "\\boxed{55}\n",
      "\\]"
     ]
    },
    {
     "ename": "TypeError",
     "evalue": "'generator' object is not subscriptable",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
      "Cell \u001b[1;32mIn[3], line 27\u001b[0m\n\u001b[0;32m     24\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m response\n\u001b[0;32m     26\u001b[0m \u001b[38;5;66;03m# 测试\u001b[39;00m\n\u001b[1;32m---> 27\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[43mllm\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m1+2+3+...+10=?\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[0;32m     28\u001b[0m \u001b[38;5;66;03m#print(response)\u001b[39;00m\n",
      "Cell \u001b[1;32mIn[3], line 23\u001b[0m, in \u001b[0;36mllm\u001b[1;34m(sys_prompt, user_prompt)\u001b[0m\n\u001b[0;32m     20\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m chunk \u001b[38;5;129;01min\u001b[39;00m stream:\n\u001b[0;32m     21\u001b[0m     \u001b[38;5;28mprint\u001b[39m(chunk[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmessage\u001b[39m\u001b[38;5;124m'\u001b[39m][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcontent\u001b[39m\u001b[38;5;124m'\u001b[39m], end\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m'\u001b[39m, flush\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[1;32m---> 23\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[43mstream\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mmessage\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcontent\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[0;32m     24\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m response\n",
      "\u001b[1;31mTypeError\u001b[0m: 'generator' object is not subscriptable"
     ]
    }
   ],
   "source": [
    "import ollama\n",
    "\n",
    "client = ollama.Client(host='http://192.168.20.43:11434')\n",
    "\n",
    "def llm(sys_prompt, user_prompt):\n",
    "\n",
    "    stream = client.chat(\n",
    "        model='deepseek-r1:32b', \n",
    "        stream=True,\n",
    "        # options可以省略，使用默认\n",
    "        options = {\n",
    "            'temperature': 0.1, \n",
    "            'top_p': 0.9, \n",
    "            'max_tokens': 1024, \n",
    "            'num_ctx':32768 \n",
    "            },\n",
    "        messages=[{'role': 'system', 'content': sys_prompt},\n",
    "                  {'role': 'user', 'content': user_prompt}],\n",
    "        )\n",
    "    for chunk in stream:\n",
    "        print(chunk['message']['content'], end='', flush=True)\n",
    "\n",
    "    response = stream['message']['content']\n",
    "    return response\n",
    "\n",
    "# 测试\n",
    "response = llm(\"\", \"1+2+3+...+10=?\")\n",
    "#print(response)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 矿泉水营销方案"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--reason--\n",
      "嗯，用户给了一个任务，要求从具体文章中提取可复用的模板，生成脑图形式的标准化大纲。首先，我需要仔细阅读用户提供的文章，理解其中的结构和内容。\n",
      "\n",
      "文章是关于矿泉水营销方案的，分为市场分析、营销对象分析和营销策略三个部分。看起来用户希望将这样的结构转化为一个模板，方便以后在类似的工作场景中使用。所以，我需要把每个部分的关键要素提取出来，用占位符替换具体的内容，同时保持结构的清晰和逻辑的严密。\n",
      "\n",
      "首先，市场分析部分提到了矿泉水市场的现状、主要品牌和市场格局。我应该把这些内容分成几个子模块，比如市场现状、主要品牌和市场格局，每个子模块用占位符表示，这样模板就能适应不同的产品或市场了。\n",
      "\n",
      "接下来是营销对象分析，这里分析了消费者的购买习惯、年龄结构和消费行为特征，还有具体的数据支持。这部分需要细化成消费者画像、消费行为特征和市场潜力评估，确保每个部分都有明确的内容点，方便后续填充数据。\n",
      "\n",
      "然后是营销策略，文章提到了品牌定位、包装设计、内容营销和事件营销。这些策略需要拆分成核心策略和具体执行方案，每个策略下再细分具体的措施，比如包装设计中的情感化元素，内容营销中的自媒体运营等。\n",
      "\n",
      "在生成大纲时，我需要确保模块独立且结构简洁，每个部分之间的层次分明。同时，使用统一的占位符，比如[XXX]，这样用户在使用模板时可以方便地替换具体信息。\n",
      "\n",
      "最后，检查整个模板是否满足通用性和可复用性的要求，是否适用于类似的工作场景，比如其他产品的营销方案。确保模板的核心要素齐全，能够帮助用户快速填充具体内容，提高工作效率。\n",
      "\n",
      "总的来说，我需要将原文的结构重新组织，提取关键点，使用占位符替换具体内容，并确保模板的结构清晰、逻辑严密，方便用户后续使用。这样生成的标准化大纲才能真正满足用户的需求，提供实际的帮助。\n",
      "\n",
      "--response--\n",
      "# [XXX]营销方案标准化大纲\n",
      "\n",
      "## 一、市场分析\n",
      "### 1.1 市场现状\n",
      "- 当前市场特点\n",
      "  - [XXX]市场品种和品牌数量\n",
      "  - [XXX]市场推广投入情况\n",
      "- 主要品牌\n",
      "  - 市场领先品牌：[XXX]、[XXX]\n",
      "  - 强势品牌：[XXX]、[XXX]\n",
      "- 市场格局\n",
      "  - [XXX]品牌市场份额占比\n",
      "  - [XXX]品牌竞争力分析\n",
      "\n",
      "### 1.2 市场趋势\n",
      "- 消费者需求变化：[XXX]\n",
      "- 行业发展动向：[XXX]\n",
      "- 竞争态势：[XXX]\n",
      "\n",
      "## 二、营销对象分析\n",
      "### 2.1 消费者画像\n",
      "- 消费者构成\n",
      "  - 经常购买者占比：[XXX]\n",
      "  - 偶尔购买者占比：[XXX]\n",
      "  - 从不购买者占比：[XXX]\n",
      "- 年龄结构\n",
      "  - 主要消费群体年龄范围：[XXX]\n",
      "- 消费习惯\n",
      "  - 价格敏感度：[XXX]\n",
      "  - 品牌忠诚度：[XXX]\n",
      "  - 购买频率：[XXX]\n",
      "\n",
      "### 2.2 消费行为特征\n",
      "- 消费者关注点：[XXX]\n",
      "- 购买决策影响因素：[XXX]\n",
      "- 消费误区：[XXX]\n",
      "\n",
      "### 2.3 市场潜力评估\n",
      "- 目标市场容量：[XXX]\n",
      "- 消费者需求未满足点：[XXX]\n",
      "- 市场增长空间：[XXX]\n",
      "\n",
      "## 三、营销策略\n",
      "### 3.1 核心策略\n",
      "- 品牌定位：[XXX]\n",
      "- 产品差异化：[XXX]\n",
      "- 目标人群锁定：[XXX]\n",
      "\n",
      "### 3.2 具体执行方案\n",
      "#### 3.2.1 产品策略\n",
      "- 包装设计方向：[XXX]\n",
      "- 产品卖点强化：[XXX]\n",
      "- 消费者价值主张：[XXX]\n",
      "\n",
      "#### 3.2.2 价格策略\n",
      "- 定价模型：[XXX]\n",
      "- 价格区间：[XXX]\n",
      "- 价格优势：[XXX]\n",
      "\n",
      "#### 3.2.3 渠道策略\n",
      "- 销售渠道布局：[XXX]\n",
      "- 渠道合作伙伴选择标准：[XXX]\n",
      "- 渠道管理措施：[XXX]\n",
      "\n",
      "#### 3.2.4 推广策略\n",
      "- 品牌传播主题：[XXX]\n",
      "- 内容营销方向：[XXX]\n",
      "- 事件营销计划：[XXX]\n",
      "- 社交媒体运营策略：[XXX]\n",
      "\n",
      "## 四、预期目标与效果评估\n",
      "### 4.1 预期目标\n",
      "- 销售目标：[XXX]\n",
      "- 市场占有率目标：[XXX]\n",
      "- 品牌知名度目标：[XXX]\n",
      "\n",
      "### 4.2 效果评估指标\n",
      "- 销量增长幅度：[XXX]\n",
      "- 品牌认知度提升：[XXX]\n",
      "- 消费者满意度：[XXX]\n",
      "\n",
      "## 五、执行计划与资源配置\n",
      "### 5.1 时间表\n",
      "- 各阶段时间节点：[XXX]\n",
      "- 关键里程碑：[XXX]\n",
      "\n",
      "### 5.2 资源投入\n",
      "- 人力配置：[XXX]\n",
      "- 财务预算：[XXX]\n",
      "- 资源整合方案：[XXX]\n",
      "\n",
      "## 六、风险分析与应对措施\n",
      "### 6.1 风险识别\n",
      "- 市场风险：[XXX]\n",
      "- 竞争风险：[XXX]\n",
      "- 操作风险：[XXX]\n",
      "\n",
      "### 6.2 应对措施\n",
      "- 风险规避策略：[XXX]\n",
      "- 应急预案：[XXX]\n",
      "- 监测与反馈机制：[XXX]\n"
     ]
    }
   ],
   "source": [
    "query = \"\"\"\n",
    "矿泉水营销方案\n",
    "\n",
    "一、市场分析\n",
    "矿泉水市场品种和品牌众多，市场推广投入较大，本地市场，娃哈哈、康师傅矿泉水占据市场领先地位，怡宝、农夫山泉属于强势品牌。\n",
    "二、营销对象分析\n",
    "消费者已形成购买饮用水的习惯，经常购买者占一部分，偶尔购买者占一部分，只有少数人从来不购买。年龄结构明显偏轻。消费行为特征：重品牌，重口感，对矿泉水、纯净水概念模糊，但已有一部分消费者认识到，长饮纯净水无益，开始留意选择优质矿泉水了。\n",
    "池州城区现有人口数量约为132.5万人，经常购买饮料水的人夏季日均购买1瓶以上，销量约3-4亿多元。偶尔购买的人夏季周均购买1瓶，销量是也过亿。\n",
    "三、营销策略：\n",
    "突出产品特征，树立健康高品质品牌形象，\n",
    "目标消费人群：40岁以上中青年\n",
    "根据品牌所锁定的不同人群进行包装设计，多添加感性的信息，譬如科学知识、幽默笑话和有内涵的情话，以及能体现消费者性格的“性格语言”等。运用自媒体的力量，不断地从品牌提炼的精神诉求中制造无穷的话题，并形成有故事有力量有吸引力的文章，设计事件营销策略，利用社会舆论的力量来为品牌加分。\n",
    "\n",
    "\"\"\"\n",
    "system_prompt = f\"\"\"\n",
    "从具体文章中提取可复用的模板，生成脑图形式的标准化大纲。要求：  \n",
    "1. 使用统一规范的占位符（如[XXX]）替换具体事件和数据。\n",
    "2. 简化模块划分，保持层次清晰，逻辑严密  \n",
    "3. 确保模板的通用性和可复用性，适用于某一具体的工作场景  \n",
    "4. 生成结构简洁、模块独立的标准化大纲  \n",
    "5. 模板应包含核心要素，便于快速填充具体内容  \n",
    "\n",
    "#文章\n",
    "矿泉水营销方案\n",
    "\n",
    "一、市场分析\n",
    "矿泉水市场品种和品牌众多，市场推广投入较大，本地市场，娃哈哈、康师傅矿泉水占据市场领先地位，怡宝、农夫山泉属于强势品牌。\n",
    "二、营销对象分析\n",
    "消费者已形成购买饮用水的习惯，经常购买者占一部分，偶尔购买者占一部分，只有少数人从来不购买。年龄结构明显偏轻。消费行为特征：重品牌，重口感，对矿泉水、纯净水概念模糊，但已有一部分消费者认识到，长饮纯净水无益，开始留意选择优质矿泉水了。\n",
    "池州城区现有人口数量约为132.5万人，经常购买饮料水的人夏季日均购买1瓶以上，销量约3-4亿多元。偶尔购买的人夏季周均购买1瓶，销量是也过亿。\n",
    "三、营销策略：\n",
    "突出产品特征，树立健康高品质品牌形象，\n",
    "目标消费人群：40岁以上中青年\n",
    "根据品牌所锁定的不同人群进行包装设计，多添加感性的信息，譬如科学知识、幽默笑话和有内涵的情话，以及能体现消费者性格的“性格语言”等。运用自媒体的力量，不断地从品牌提炼的精神诉求中制造无穷的话题，并形成有故事有力量有吸引力的文章，设计事件营销策略，利用社会舆论的力量来为品牌加分。\n",
    "\n",
    "\"\"\"\n",
    "\n",
    "response, reason = llm(\"\", system_prompt)\n",
    "print(\"--reason--\")\n",
    "print(reason)\n",
    "print(\"\\n--response--\")\n",
    "print(response)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 测试推理模型生成引用答案"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<think>\n",
      "嗯，用户问的是“卸油八步法是什么”。我需要先理解这个问题，然后根据提供的上下文来回答。\n",
      "\n",
      "首先，看看各个上下文内容：\n",
      "\n",
      "- 上下文1提到地罐交接卸油的“八步法”，其中第一步是引车到位，包括停车位置、关闭引擎、拉手刹等。\n",
      "- 上下文2讲的是罐车交接的“十步法”，但用户问的是八步法，所以可能不相关。\n",
      "- 上下文3提到加油站采用地罐交接时使用八步法，油罐车交接用十步法。\n",
      "- 上下文4详细描述了地罐交接卸油的八步法操作流程，包括引车到位、安全防护、检查铅封、核对单据、准备接卸、开始卸油、稳油计量和收尾工作等步骤。\n",
      "- 其他上下文可能不直接相关。\n",
      "\n",
      "所以，主要的信息来源是上下文1和4。根据这些内容，我可以整理出八步法的具体步骤：\n",
      "\n",
      "1. 引车到位：引导油罐车到指定位置，确保安全措施到位。\n",
      "2. 安全防护：穿戴防护用品，设置警戒线，连接静电报警器等。\n",
      "3. 检查铅封和单据：核对物理或电子铅封，确认无异常；检查系统单据，避免选错。\n",
      "4. 准备接卸：确保油罐车司押人员不上车，加油站检查设备，准备接卸工具。\n",
      "5. 开始卸油：启动卸油泵，监控过程，处理异常情况。\n",
      "6. 稳油计量：卸油前后稳油3分钟，抄录泵码数和液位数据。\n",
      "7. 收尾工作：检查损溢，打印核对单，签字确认，处理异常情况。\n",
      "\n",
      "需要注意的是，这些步骤可能需要进一步细化，但根据提供的上下文，已经涵盖了主要的操作流程。同时，要确保引用正确，每个步骤都要对应到相应的上下文编号中。\n",
      "\n",
      "最后，回答时要按照规范格式，使用[citation:X]标注来源，并且内容准确无误。\n",
      "</think>\n",
      "\n",
      "卸油八步法是中国石化销售股份有限公司加油站管理规范中规定的一种操作流程，适用于地罐交接卸油的情况。以下是具体的八步法操作流程：\n",
      "\n",
      "1. **引车到位**：引导油罐车停在指定的卸油位置，确保车头朝向加油站出口，关闭引擎和电门，拉起手刹，并在车轮下放置防滑设备 [citation:1][citation:4]。\n",
      "\n",
      "2. **安全防护**：穿戴好个人防护用品，拉好警戒线，摆放警示牌和消防器材，并将卸油静电报警器连接至油罐车接地扁铁 [citation:2][citation:4]。\n",
      "\n",
      "3. **检查铅封和单据**：加油站需检查核对物理铅封的铅封号或电子铅封状态，发现异常立即上报并停止卸油。同时，计量员需认真核对系统单据，确认数量、油品、罐号、空容等信息 [citation:4]。\n",
      "\n",
      "4. **准备接卸**：加油站应避免接卸油品时超低液位或卸后超安全容积。在卸油前和卸油后，均需确保接卸油罐对应油枪暂停加油3分钟（即卸油油罐稳油3分钟），以便液位仪能准确计量前尺和后尺 [citation:4]。\n",
      "\n",
      "5. **开始卸油**：启动卸油泵，监控卸油过程。发现数质量问题时，按照相关应急预案处理 [citation:5][citation:4]。\n",
      "\n",
      "6. **稳油计量**：完成收油后，计量员需检查收油损溢情况。如果V20超耗，需打印《地罐交接进油核对单》，由承运驾驶员签字确认卸油数据。驾驶员如有异议，可在核对单上备注说明 [citation:4]。\n",
      "\n",
      "7. **收尾工作**：接卸完毕后，加油站需在零管系统中维护到货信息，并在纸质单据上签字确认，不得由司押人员代签 [citation:5][citation:4]。\n",
      "\n",
      "通过以上八步法操作流程，确保卸油过程的安全、规范和准确。"
     ]
    },
    {
     "ename": "TypeError",
     "evalue": "'generator' object is not subscriptable",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
      "Cell \u001b[1;32mIn[5], line 28\u001b[0m\n\u001b[0;32m      1\u001b[0m query \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\"\"\u001b[39m\n\u001b[0;32m      2\u001b[0m \u001b[38;5;124m## 以下内容是基于用户请求的搜索结果\u001b[39m\n\u001b[0;32m      3\u001b[0m \u001b[38;5;124m[context 1 begin]\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m      \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mtitle\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m: \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mRAGFLOW:b02d679c0ed711f09bb9165ce2a5c3f9:3463dfb2144811f08b15165ce2a5c3f9:a2ccdbf9d09442a6:油品销售事业部-289760《中国石化销售股份有限公司加油站管理规范》.pdf\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m,\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m      \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mcontent\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m: \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m6.6.4 安装防水滤芯的加油枪所对应的油罐可边卸边发。在计量进货油罐前尺和后尺的同时，需抄录对应油枪的泵码数。6.6.4.1 地罐交接卸油“八步法”操作流程：（1）引车到位。引导油罐车停在指定卸油位置（车头宜朝向加油站出口），关闭引擎和电门，拉起手刹，在车轮下放置防滑设备，检查并保证油罐车紧急撤离通道的畅通。\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m[context 1 end]\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m[context 2 begin]\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m      \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mtitle\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m: \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mRAGFLOW:b02d679c0ed711f09bb9165ce2a5c3f9:3463dfb2144811f08b15165ce2a5c3f9:df5df38e73cce22f:油品销售事业部-289760《中国石化销售股份有限公司加油站管理规范》.pdf\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m,\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m      \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mcontent\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m: \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m6.6.4.2 罐车交接卸油“十步法”操作流程：（1）引车到位。引导油罐车停在指定卸油位置（车头宜朝向加油站出口），关闭引擎和电门，拉起手刹，在车轮下放置防滑设备。（2）安全防护。穿戴好个人防护用品；拉好警戒线，摆放警示牌和消防器材；将卸油静电报警器连接至油罐车接地扁铁。\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m[context 2 end]\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m[context 3 begin]\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m      \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mtitle\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m: \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mRAGFLOW:b02d679c0ed711f09bb9165ce2a5c3f9:3463dfb2144811f08b15165ce2a5c3f9:ef64486b4d2e8d85:油品销售事业部-289760《中国石化销售股份有限公司加油站管理规范》.pdf\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m,\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m      \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mcontent\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m: \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m6.6.2 接卸人员应穿戴防静电服装，使用防爆用具，登罐车应戴好安全帽。6.6.3 加油站采用地罐交接计量卸油的，按照《地罐交接卸油“八步法”操作流程》操作；采用油罐车交接计量卸油的，按照《罐车交接卸油“十步法”操作流程》操作。\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m[context 3 end]\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m[context 4 begin]\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m      \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mtitle\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m: \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mRAGFLOW:aecea7d00ec811f08e22165ce2a5c3f9:df10f1360ef111f0bab8165ce2a5c3f9:20b270d97618aa4c:关于印发《四川石油分公司地罐交接管理实施细则》的通知.docx\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m,\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m      \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mcontent\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m: \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m4.3.3 加油站应按照地罐交接卸油“八步法”，规范操作。油罐车进站停好熄火后，应上交车钥匙给加油站，在卸油过程中禁止油罐车司押人员进入驾驶室；加油站需检查核对物理铅封的铅封号或检查电子铅封状态，发现异常立即上报并停止卸油；计量员需认真核对系统单据，确认数量、油品、罐号、空容，避免系统有多张单据情况下选错单据；因为网络或系统原因，加油站管控系统暂时未收到单据的情况，加油站应跟分公司业务部门确认，确认后按照无货单验收操作，后期单据传到管控后必须进行单据关联；加油站应避免接卸油品时超低液位、避免卸后超安全容积，卸油前、卸油后均应确保接卸油罐对应油枪暂停加油3分钟（即卸油油罐稳油3分钟），以便液位仪能准确计量前尺和后尺。完成收油后，计量员要检查收油损溢情况，发现V20超耗的，计量员须打印《地罐交接进油核对单》，由承运驾驶员签字确认卸油数据，驾驶员对超耗原因有分析（异议）的，可在核对单上备注说明。\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m[context 4 end]\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m[context 5 begin]\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m      \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mtitle\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m: \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mRAGFLOW:b02d679c0ed711f09bb9165ce2a5c3f9:b32714e6144711f0a49a165ce2a5c3f9:04b381d321381372:油品销售事业部-157864中国石化销售有限公司成品油公路运输承运商管理指导意见.pdf\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m,\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m      \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mcontent\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m: \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m5.6 车辆到达加油站后，司押人员必须听从加油站工作人员指挥，按照卸油“十步法”流程接卸油品。接卸完毕后加油站要在零管系统中维护到货信息并在纸质单据上签字确认，不得由司押人员代签。发现数质量问题按照《中国石油化工股份有限公司销售企业油品质量事故应急预案》（石化股份销安[2011]36号）和《中国石油化工股份有限公司油品销售企业计量突发事件应急预案》（石化股份销安[2011]37 号）及其他相关数质量管理办法处理。因承运商方面造成损失的，加油站和承运商共同确认超耗数量，加油站按当日对应品号油品最高零售价折算成赔付金额报零售中心汇总，零售中心将汇总结果提交数质量管理处和物流中心确认赔偿金额，由物流中心向承运商索赔。赔款到账后，由零售中心对承运商开具销售发票，数质量管理处对零售中心超耗量进行核销。原则上不允许采取现场赔付，已与承运商协商通过现场赔付方式解决数质量纠纷的企业要制定现场赔付管理办法，规范操作流程，采取有效监管措施确保承运商购买油品如实回罐，规避经营风险。\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m[context 5 end]\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m[context 6 begin]\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m      \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mtitle\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m: \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mRAGFLOW:b02d679c0ed711f09bb9165ce2a5c3f9:3463dfb2144811f08b15165ce2a5c3f9:0d9e296dca5b1834:油品销售事业部-289760《中国石化销售股份有限公司加油站管理规范》.pdf\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m,\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m      \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mcontent\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m: \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m4.1.3.1 领班（站长）带领接班员工列队（在监控下、不影响车辆通行、便于顾客观看之处定点开展）。4.1.3.2 召开班前会，领班（站长）向员工简要传达公司有关会议或文件精神，布置本班工作，交代注意事项，员工互查仪容仪表。4.1.3.3 领班（站长）带领员工进行加油八步法演练。\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m[context 6 end]\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m[context 7 begin]\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m      \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mtitle\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m: \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mRAGFLOW:aecea7d00ec811f08e22165ce2a5c3f9:c923d10a0ef011f0b5ec165ce2a5c3f9:dea20c445679cee8:7《加油（气）站站长考评管理办法》.docx\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m,\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m      \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mcontent\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m: \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m2）实际操作：加油服务八步法、油品接卸与计量、加油机故障排除，加油卡管控系统、EP系统操作，液位仪、视频监控设备的使用等内容。3）竞聘演讲包括对站长工作的认识，个人工作经历及优势，对下一步工作打算。演讲结束后，考评领导小组有针对性的提出问题，竞聘者现场答辩。\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m[context 7 end]\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\n\u001b[1;32m   (...)\u001b[0m\n\u001b[0;32m      6\u001b[0m \u001b[38;5;124m卸油八步法是什么   \u001b[39m\n\u001b[0;32m      7\u001b[0m \u001b[38;5;124m\"\"\"\u001b[39m\n\u001b[0;32m      8\u001b[0m system_prompt \u001b[38;5;241m=\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\"\"\u001b[39m\n\u001b[0;32m      9\u001b[0m \u001b[38;5;124m## 回答注意事项\u001b[39m\n\u001b[0;32m     10\u001b[0m \u001b[38;5;124m- 内容限定：仅基于提供的搜索结果（以 [context X begin]..[context X end] 格式标注）进行回答，禁止添加任何未在引用中出现的信息 [citation:X]。\u001b[39m\n\u001b[1;32m   (...)\u001b[0m\n\u001b[0;32m     25\u001b[0m \n\u001b[0;32m     26\u001b[0m \u001b[38;5;124m\"\"\"\u001b[39m\n\u001b[1;32m---> 28\u001b[0m \u001b[43mllm\u001b[49m\u001b[43m(\u001b[49m\u001b[43msystem_prompt\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mquery\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m     29\u001b[0m \u001b[38;5;66;03m# print(\"\\n--response--\")\u001b[39;00m\n\u001b[0;32m     30\u001b[0m \u001b[38;5;66;03m# print(response)\u001b[39;00m\n",
      "Cell \u001b[1;32mIn[3], line 23\u001b[0m, in \u001b[0;36mllm\u001b[1;34m(sys_prompt, user_prompt)\u001b[0m\n\u001b[0;32m     20\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m chunk \u001b[38;5;129;01min\u001b[39;00m stream:\n\u001b[0;32m     21\u001b[0m     \u001b[38;5;28mprint\u001b[39m(chunk[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmessage\u001b[39m\u001b[38;5;124m'\u001b[39m][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcontent\u001b[39m\u001b[38;5;124m'\u001b[39m], end\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m'\u001b[39m, flush\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[1;32m---> 23\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[43mstream\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mmessage\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcontent\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[0;32m     24\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m response\n",
      "\u001b[1;31mTypeError\u001b[0m: 'generator' object is not subscriptable"
     ]
    }
   ],
   "source": [
    "query = \"\"\"\n",
    "        ## 以下内容是基于用户请求的搜索结果\n",
    "        [context 1 begin]\\n      \\\"title\\\": \\\"RAGFLOW:aecea7d00ec811f08e22165ce2a5c3f9:1c654b1c0eee11f0abc9165ce2a5c3f9:36c2e7bcdfebd041:关于印发《四川石油分公司党组织工作经费管理和使用实施细则》的通知.docx\\\",\\n      \\\"content\\\": \\\"4.1.5党员可报销跨单位联系服务库站的误餐费，党支部书记或支委负责核定党员报销误餐费的真实性，优先从省公司下达企业管理费用中的党组织工作经费科目报销；按不高于《四川石油分公司差旅费管理办法》第3.3条规定标准等公司财务管理规定，以党支部为单位每季度或半年集中通过报销系统报销。\\\"\\n[context 1 end]\\n\\n\\n[context 2 begin]\\n      \\\"title\\\": \\\"RAGFLOW:aecea7d00ec811f08e22165ce2a5c3f9:4cc810460eee11f08007165ce2a5c3f9:c2a4d7a5d315757d:24.四川石油分公司教育培训费用管理办法.docx\\\",\\n      \\\"content\\\": \\\"培训费用使用应厉行节约，避免铺张浪费，不得超标准使用（具体要求按《中国石化销售企业培训费用管理办法》、《四川石油差旅费管理办法》执行）。培训费用使用自觉接受各部门监督，不得虚报、谎报相关费用；报销流程必须符合财务相关制度要求。\\\"\\n[context 2 end]\n",
    "        \n",
    "        ## 用户请求\n",
    "        卸四川石油分公司差旅费报销的标准是多少 \n",
    "\"\"\"\n",
    "system_prompt = f\"\"\"\n",
    "## 回答注意事项\n",
    "- 内容限定：仅基于提供的搜索结果（以 [context X begin]..[context X end] 格式标注）进行回答，禁止添加任何未在引用中出现的信息 [citation:X]。\n",
    "- 事实准确性：避免任何事实性错误或幻觉信息，确保回答内容完全源自引用且真实可靠 [citation:X]。\n",
    "- 语言一致性：除非用户明确要求，回答语言需与提问语言保持一致（如中文提问用中文回答） [citation:X]。\n",
    "\n",
    "## 规范引用格式说明\n",
    "所有引用通过 \n",
    "[context X begin]..[context X end] 提供，X 为引用编号。引用需严格遵循以下规则：\n",
    "1. 精准关联：引用编号需直接支撑回答中的对应语句，确保内容高度相关 [citation:X]。\n",
    "2. 单引用格式：[citation:X]，示例：\n",
    "    - 提问：“中国的首都是哪里？”\n",
    "    - 回答：北京是中国的首都 [citation:1]（假设 context 1 明确提到 “北京是中国的首都”）。\n",
    "3. 多引用格式：若一句话涉及多个引用，并列标注编号 [citation:X][citation:Y]，示例：\n",
    "    - 提问：“中日两国的首都分别是哪里？”\n",
    "    - 回答：北京是中国的首都，东京是日本的首都 [citation:1][citation:2]（假设 context 1 对应北京，context 2 对应东京）。\n",
    "4. 筛选与核对：结合问题主题筛选引用，避免因误解引用内容导致错误标注 [citation:X]。\n",
    "\n",
    "\"\"\"\n",
    "\n",
    "llm(system_prompt, query)\n",
    "# print(\"\\n--response--\")\n",
    "# print(response)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
